HackTheBox - PC WriteUp - Máquina retirada
Encendemos la maquina PC y obtenemos la dirección 10.129.56.82, para confirmar que la maquina esta activa lanzamos una traza ICMP
Y vemos que recibimos las 5 trazas enviadas seguido de un TTL de 63, por tanto estamos frente a una maquina Linux
Enumeración
Para la enumeración lanzamos un escaneo con nmap a todo el rango de puertos y exportamos la captura en el formato “G” para pasarlo a la utilidad de extractPorts:
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.56.82 -oG allPorts
Una vez con la captura de nmap representado los puertos abiertos hacemos una limpieza del ruido:
Usando extractPorts podremos ver la información mas relevante de la captura de nmap:
Ahora pasamos a hacer un escaneo exhaustivo y vemos los puertos 22 y 50051 abiertos.
Al no saber nada sobre el puerto 50051 haciendo búsquedas en internet encontramos un servicio llamado grpc
buscando un poco de información en Github encontramos un repositorio que tiene un herramienta de consola, que a modo de cliente esta inspirada en curl para acceder al servicio grpc. Podremos instalar la herramienta con
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
Con la herramienta instalada podremos ver que argumentos debemos pasarle para poder hacer uso de la API que tenemos expuesta por el puerto 50051
Vemos algunos parámetros interesantes como -plaintext, list, describe, etc
Y vemos que la maquina tiene un servicio llamado SimpleApp, donde usando “describe” podemos ver los métodos o servicios para la API en este servicio de SimpleApp
Podemos ver que es un servicio y los métodos que tiene. Usando la función “getInfo” tendremos la información de los parámetros que espera cada uno de los métodos
grpcurl -plaintext 10.129.56.82:50051 SimpleApp.getInfo
Revisando un poco el manual de la herramienta de grpcurl podemos ver que el parámetro “-d” nos permite agregar parámetros y al saber que hay un método RegisterUser nos registramos en el servicio.
Al tratar de traer la información vemos que nos pide un token en header, asi que pasándole los datos con los que nos registramos pero llamando al método LoginUser nos retorna el servicio un ID 707
Pero vemos que no es dinámico el ID y cambia después de cada petición:
Curiosamente postman permite trabajar con grpc al momento de crear un nuevo proyecto:
Desde postman podremos ver directamente los métodos de la API que tenemos expuesta.
Intentamos loguearnos con credenciales por defecto como admin:admin y vemos que es posible y que existe este usuario.
Pero en el postman vemos que en Metadata se nos ha generado un token
Llamando al método getInfo ya podemos utilizar el token y vemos que la respuesta es el id y que la API pronto actualizara la información.
Si probamos como Header en la consola con grpcurl vemos la misma información.
Al servicio estar almacenando usuarios y contraseñas probamos con una inyección SQL
order by 1-- -
Generando la estructura
{"id": "536 order by 1-- -"}
Pero nos responde con will update soon
Seguido me hace pensar en que hay 1 columna valida, por tanto probando la consulta
union select 1-- -
vemos que nos responde con 1
Tratamos de listar las version de la base da datos pero obtenemos un error, hasta que después de unas búsquedas en internet del método version() para distintos motores de bases de datos logramos ver información relevante con sqlite_version()
Al conocer la version de la base de datos ya solo nos queda probar una inyección:
tbl_name FROM sqlite_master WHERE type=\"table"\
Y vemos que la tabla se llama accounts, como siempre en una buena enumeración de base de datos podemos usar group_concat
union select group_concat(username) from accounts limit 1
Seguido de saber que los usuarios son (admin y sau) recuperamos sus contraseñas
union select group_concat(password) from accounts limit 1
Y obtenemos (admin y HereIsYourPassword1431).
Probamos a reutilizar credenciales con el servicio expuesto ssh sau:HereIsYourPassword y obtendremos acceso a la maquina.
Escalada
Para la escalada vemos que no tenemos permisos o privilegios asignado a nivel de sudoers.
Probamos a enumerar por binarios con privilegio SUID
Pero no encontramos nada asi que seguimos con la enumeración al sistema
Vemos que el directorio /opt tiene una aplicación en python pero enumerando estos archivos no encontramos nada interesante
Mirando la información de puertos abiertos internamente en la maquina con netstat -nat vemos el puerto 8000 y el puerto 9666
Gracias a que estamos con ssh podemos hacer uso de un Local Port Forwarding
ssh sau@10.129.56.82 -L 8000:127.0.0.1:8000 -L 9666:127.0.0.1:9666
De esta forma podemos acceder desde nuestro navegador al puerto 8000
Y vemos un panel de autenticación pyLoad. Haciendo uso del commando ps -eo command vemos que alguien en el sistema esta ejecutando /usr/bin/python3 /usr/local/bin/pyload
Entonces mirando la información del dueño de este binario vemos que root lo esta ejecutando y que si tratamos de ejecutarlo no podremos hacerlo. Lo que si podemos hacer el leer el contenido del archivo entonces lo revisaremos con cat
Mas allá de entender como funciona el código podemos ver que importa una librería llamada pyload, por lo tanto se me ocurre mirar la version y vemos pyload 0.5.0
Lo primero a intentar sera un exploit encontrado en exploitdb para pyload 0.5.0, rápidamente para lograr esto nos iremos a /dev/shm el cual es un directorio donde tendremos capacidades rwx.
La idea es copiar el script en python haciendo uso de base64 y darle permisos de ejecución en la maquina.
y vemos que el exploit funciona porque hemos logrado meter el output de un comando “whoami” en el archivo file en la maquina.
siguiendo este principio le asignamos el privilegio SUID a la bash para poder ejecutarla temporalmente como el propietario haciendo uso de “bash -p”
Asi habremos completado la maquina PC
